// 视频上传服务
// 处理视频文件上传、管理等功能

// 模拟API延迟
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms))

// 支持的视频格式
const SUPPORTED_VIDEO_FORMATS = ['.mp4', '.mov', '.avi', '.wmv', '.flv', '.mkv', '.webm']

// 支持的图片格式
const SUPPORTED_IMAGE_FORMATS = ['.jpg', '.jpeg', '.png', '.gif', '.webp']

// 上传服务
export const uploadService = {
  // 检查文件格式是否支持
  isValidVideoFormat(filename) {
    const extension = filename.toLowerCase().substr(filename.lastIndexOf('.'))
    return SUPPORTED_VIDEO_FORMATS.includes(extension)
  },
  
  // 检查缩略图格式是否支持
  isValidImageFormat(filename) {
    const extension = filename.toLowerCase().substr(filename.lastIndexOf('.'))
    return SUPPORTED_IMAGE_FORMATS.includes(extension)
  },
  
  // 获取文件大小的可读格式
  formatFileSize(bytes) {
    if (bytes === 0) return '0 Bytes'
    
    const k = 1024
    const sizes = ['Bytes', 'KB', 'MB', 'GB']
    const i = Math.floor(Math.log(bytes) / Math.log(k))
    
    return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]
  },
  
  // 模拟视频上传
  async uploadVideo(file, onProgress) {
    try {
      // 检查文件格式
      if (!this.isValidVideoFormat(file.name)) {
        throw new Error(`不支持的视频格式。支持的格式: ${SUPPORTED_VIDEO_FORMATS.join(', ')}`)
      }
      
      // 检查文件大小（这里限制为500MB）
      const maxSize = 500 * 1024 * 1024
      if (file.size > maxSize) {
        throw new Error(`文件过大。最大支持 ${this.formatFileSize(maxSize)}`)
      }
      
      // 模拟上传进度
      let progress = 0
      const interval = setInterval(() => {
        progress += Math.random() * 20
        if (progress > 100) progress = 100
        if (onProgress) onProgress(progress)
        if (progress === 100) clearInterval(interval)
      }, 500)
      
      // 模拟上传延迟
      await delay(3000)
      
      // 模拟返回上传后的视频URL
      return {
        url: `https://example.com/videos/${Date.now()}_${file.name}`,
        size: file.size,
        duration: this.calculateVideoDuration(file),
        format: file.name.split('.').pop(),
        uploadedAt: new Date().toISOString()
      }
    } catch (error) {
      console.error('视频上传失败:', error)
      throw error
    }
  },
  
  // 模拟上传缩略图
  async uploadThumbnail(file, onProgress) {
    try {
      // 检查文件格式
      if (!this.isValidImageFormat(file.name)) {
        throw new Error(`不支持的图片格式。支持的格式: ${SUPPORTED_IMAGE_FORMATS.join(', ')}`)
      }
      
      // 检查文件大小（这里限制为10MB）
      const maxSize = 10 * 1024 * 1024
      if (file.size > maxSize) {
        throw new Error(`文件过大。最大支持 ${this.formatFileSize(maxSize)}`)
      }
      
      // 模拟上传进度
      let progress = 0
      const interval = setInterval(() => {
        progress += Math.random() * 30
        if (progress > 100) progress = 100
        if (onProgress) onProgress(progress)
        if (progress === 100) clearInterval(interval)
      }, 300)
      
      // 模拟上传延迟
      await delay(1500)
      
      // 模拟返回上传后的图片URL
      return {
        url: `https://example.com/thumbnails/${Date.now()}_${file.name}`,
        size: file.size,
        format: file.name.split('.').pop(),
        uploadedAt: new Date().toISOString()
      }
    } catch (error) {
      console.error('缩略图上传失败:', error)
      throw error
    }
  },
  
  // 模拟计算视频时长
  calculateVideoDuration(file) {
    // 实际项目中应该使用视频处理库来获取真实时长
    // 这里简单模拟一个1-600秒的时长
    return Math.floor(Math.random() * 600) + 1
  },
  
  // 模拟创建视频信息
  async createVideoInfo(videoData) {
    try {
      await delay(500)
      
      const newVideo = {
        ...videoData,
        id: `video_${Date.now()}`,
        createdAt: new Date().toISOString(),
        updatedAt: new Date().toISOString(),
        views: 0,
        likes: 0,
        dislikes: 0,
        comments: 0,
        shares: 0,
        status: 'pending' // pending, approved, rejected
      }
      
      // 在实际项目中，这里应该调用API保存视频信息
      // const response = await fetch('/api/videos', {
      //   method: 'POST',
      //   headers: { 'Content-Type': 'application/json' },
      //   body: JSON.stringify(newVideo)
      // })
      // return await response.json()
      
      return newVideo
    } catch (error) {
      console.error('创建视频信息失败:', error)
      throw error
    }
  },
  
  // 模拟更新视频信息
  async updateVideoInfo(videoId, updateData) {
    try {
      await delay(300)
      
      const updatedVideo = {
        ...updateData,
        id: videoId,
        updatedAt: new Date().toISOString()
      }
      
      // 在实际项目中，这里应该调用API更新视频信息
      // const response = await fetch(`/api/videos/${videoId}`, {
      //   method: 'PUT',
      //   headers: { 'Content-Type': 'application/json' },
      //   body: JSON.stringify(updatedVideo)
      // })
      // return await response.json()
      
      return updatedVideo
    } catch (error) {
      console.error('更新视频信息失败:', error)
      throw error
    }
  },
  
  // 模拟删除视频
  async deleteVideo(videoId) {
    try {
      await delay(300)
      
      // 在实际项目中，这里应该调用API删除视频
      // await fetch(`/api/videos/${videoId}`, { method: 'DELETE' })
      
      return { success: true, message: '视频删除成功' }
    } catch (error) {
      console.error('删除视频失败:', error)
      throw error
    }
  },
  
  // 模拟获取视频上传历史
  async getUploadHistory(userId, page = 1, limit = 10) {
    try {
      await delay(500)
      
      // 模拟返回上传历史
      const history = []
      for (let i = 0; i < limit; i++) {
        const statuses = ['pending', 'approved', 'rejected', 'processing']
        history.push({
          id: `video_${Date.now()}_${i}`,
          title: `上传的视频 ${i + 1}`,
          thumbnail: `https://placehold.co/400x225/00a1d6/FFFFFF?text=Video+${i + 1}`,
          status: statuses[Math.floor(Math.random() * statuses.length)],
          createdAt: new Date(Date.now() - i * 86400000).toISOString(),
          duration: Math.floor(Math.random() * 600) + 30,
          views: Math.floor(Math.random() * 10000)
        })
      }
      
      return {
        videos: history,
        total: 100,
        page,
        limit,
        totalPages: Math.ceil(100 / limit)
      }
    } catch (error) {
      console.error('获取上传历史失败:', error)
      throw error
    }
  }
}

// 导出默认服务
export default uploadService